const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const fs = require('fs');

// SQLite数据库文件路径
const DB_PATH = path.join(__dirname, '../data/music_player.db');

// 确保数据目录存在
const dataDir = path.dirname(DB_PATH);
if (!fs.existsSync(dataDir)) {
  fs.mkdirSync(dataDir, { recursive: true });
}

// 创建数据库连接
const db = new sqlite3.Database(DB_PATH, (err) => {
  if (err) {
    console.error('❌ SQLite数据库连接失败:', err.message);
  } else {
    console.log('✅ SQLite数据库连接成功');
  }
});

// 测试数据库连接
async function testConnection() {
  return new Promise((resolve, reject) => {
    db.get('SELECT 1', (err) => {
      if (err) {
        console.error('❌ 数据库连接测试失败:', err.message);
        resolve(false);
      } else {
        console.log('✅ 数据库连接正常');
        resolve(true);
      }
    });
  });
}

// 执行查询（转换为Promise）
async function query(sql, params = []) {
  return new Promise((resolve, reject) => {
    if (sql.trim().toUpperCase().startsWith('SELECT') || sql.trim().toUpperCase().startsWith('SHOW')) {
      // 查询操作
      db.all(sql, params, (err, rows) => {
        if (err) {
          console.error('数据库查询错误:', err);
          reject(err);
        } else {
          resolve(rows);
        }
      });
    } else {
      // 插入/更新/删除操作
      db.run(sql, params, function(err) {
        if (err) {
          console.error('数据库操作错误:', err);
          reject(err);
        } else {
          resolve({
            insertId: this.lastID,
            affectedRows: this.changes
          });
        }
      });
    }
  });
}

// 执行事务
async function transaction(callback) {
  return new Promise((resolve, reject) => {
    db.serialize(async () => {
      try {
        await query('BEGIN TRANSACTION');
        const result = await callback(query);
        await query('COMMIT');
        resolve(result);
      } catch (error) {
        await query('ROLLBACK');
        reject(error);
      }
    });
  });
}

module.exports = {
  db,
  query,
  transaction,
  testConnection
};